<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Flow: log/simple_ostream_logger.hpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr id="projectrow">
  <td id="projectalign">
   <div id="projectname">Flow<span id="projectnumber">&#160;2.0.0</span>
   </div>
   <div id="projectbrief">Flow project: Full implementation reference.</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_9381a7bbd03577d6d8720c7f35c94ffa.html">log</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle"><div class="title">simple_ostream_logger.hpp</div></div>
</div><!--header-->
<div class="contents">
<a href="simple__ostream__logger_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno">    1</span><span class="comment">/* Flow</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno">    2</span><span class="comment"> * Copyright 2023 Akamai Technologies, Inc.</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno">    3</span><span class="comment"> *</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno">    4</span><span class="comment"> * Licensed under the Apache License, Version 2.0 (the</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno">    5</span><span class="comment"> * &quot;License&quot;); you may not use this file except in</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno">    6</span><span class="comment"> * compliance with the License.  You may obtain a copy</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno">    7</span><span class="comment"> * of the License at</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno">    8</span><span class="comment"> *</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno">    9</span><span class="comment"> *   https://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno">   10</span><span class="comment"> *</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno">   11</span><span class="comment"> * Unless required by applicable law or agreed to in</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno">   12</span><span class="comment"> * writing, software distributed under the License is</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno">   13</span><span class="comment"> * distributed on an &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno">   14</span><span class="comment"> * CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno">   15</span><span class="comment"> * See the License for the specific language governing</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno">   16</span><span class="comment"> * permissions and limitations under the License. */</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno">   17</span><span class="comment"></span> </div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno">   18</span><span class="comment">/// @file</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno">   19</span><span class="comment"></span><span class="preprocessor">#pragma once</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno">   20</span> </div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno">   21</span><span class="preprocessor">#include &quot;<a class="code" href="ostream__log__msg__writer_8hpp.html">flow/log/ostream_log_msg_writer.hpp</a>&quot;</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno">   22</span><span class="preprocessor">#include &quot;<a class="code" href="log_8hpp.html">flow/log/log.hpp</a>&quot;</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno">   23</span><span class="preprocessor">#include &quot;<a class="code" href="util__fwd_8hpp.html">flow/util/util_fwd.hpp</a>&quot;</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno">   24</span><span class="preprocessor">#include &lt;boost/array.hpp&gt;</span></div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno">   25</span><span class="preprocessor">#include &lt;boost/shared_ptr.hpp&gt;</span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno">   26</span> </div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno">   27</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceflow_1_1log.html">flow::log</a></div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno">   28</span>{</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno">   29</span> </div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno">   30</span><span class="comment">// Types.</span></div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno">   31</span><span class="comment"></span> </div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno">   32</span><span class="comment">/**</span></div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno">   33</span><span class="comment"> * An implementation of Logger that logs messages to the given `ostream`s (e.g., `cout` or</span></div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno">   34</span><span class="comment"> * an `ofstream` for a file).  Protects against garbling due to simultaneous logging from multiple</span></div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno">   35</span><span class="comment"> * threads.</span></div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno">   36</span><span class="comment"> *</span></div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno">   37</span><span class="comment"> * Vaguely speaking, this Logger is suitable for console (`cout`, `cerr`) output; and, in a pinch outside of a</span></div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno">   38</span><span class="comment"> * heavy-duty production/server environment, for file (`ofstream`) output.  For heavy-duty file logging one</span></div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno">   39</span><span class="comment"> * should use Async_file_logger.  The primary reason is performance; this is discussed in the Logger class doc header.</span></div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno">   40</span><span class="comment"> * A secondary reason is additional file-logging-specific utilities -- such as rotation -- are now or in the future</span></div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno">   41</span><span class="comment"> * going to be in Async_file_logger, as its purpose is heavy-duty file logging specifically.</span></div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno">   42</span><span class="comment"> *</span></div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno">   43</span><span class="comment"> * ### Thread safety ###</span></div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno">   44</span><span class="comment"> * As noted above, simultaneous logging from multiple threads is safe from output corruption, in that</span></div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno">   45</span><span class="comment"> * simultaneous do_log() calls for the same Logger targeting the same stream will log serially to each other.</span></div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno">   46</span><span class="comment"> *</span></div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno">   47</span><span class="comment"> * Additionally, changes to the Config (which controls should_log() behavior among other things), pointer to which</span></div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno">   48</span><span class="comment"> * is passed to constructor, are thread-safe against should_log() and do_log() if and only if class Config doc header</span></div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno">   49</span><span class="comment"> * describes them as such.  Short version: You can&#39;t modify the Config anymore (while should_log() and do_log())</span></div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno">   50</span><span class="comment"> * except you can dynamically modify verbosity via Config::configure_default_verbosity() and</span></div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno">   51</span><span class="comment"> * Config::configure_component_verbosity() or Config::configure_component_verbosity_by_name().</span></div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno">   52</span><span class="comment"> *</span></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno">   53</span><span class="comment"> * There are no other mutable data (state), so that&#39;s that.</span></div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno">   54</span><span class="comment"> *</span></div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno">   55</span><span class="comment"> * ### Thread safety: Corner case: Don&#39;t cross the `ostream`s! ###</span></div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno">   56</span><span class="comment"> * There is another, arguably subtle, thread safety issue.</span></div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno">   57</span><span class="comment"> * Bottom line/summary: If you pass `ostream` S (including `cout` and `cerr`)</span></div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno">   58</span><span class="comment"> * into object Simple_ostream_logger S1 constructor, then don&#39;t</span></div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno">   59</span><span class="comment"> * access S from any other code, including outside code printing to S, AND including indirect access via any other</span></div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno">   60</span><span class="comment"> * Simple_ostream_logger S2 that isn&#39;t S1 -- at least not when S1 might be logging.</span></div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno">   61</span><span class="comment"> *</span></div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno">   62</span><span class="comment"> * Now in more detail: Suppose S is an underlying `ostream`; for example S could be `cerr`.</span></div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno">   63</span><span class="comment"> * Suppose Simple_ostream_logger S1 is constructed with S, meaning it will always print to `cerr`.  Finally,</span></div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno">   64</span><span class="comment"> * suppose some other unrelated code *also* accesses the stream S *while* a log statement is printing</span></div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno">   65</span><span class="comment"> * to S through S1; for example that code might be writing some raw printouts to standard error by means</span></div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno">   66</span><span class="comment"> * of `cerr &lt;&lt;`.  Hence, S is being write-accessed from 2 threads.</span></div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno">   67</span><span class="comment"> * At best, this can cause garbled output.  (This is unavoidable but could be seen as acceptable functionally.)</span></div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno">   68</span><span class="comment"> * However the danger doesn&#39;t end there; internally S1 code will use stateful formatters to affect the output.</span></div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno">   69</span><span class="comment"> * Write ops via `ostream` formatters are *not* thread-safe against use of formatters on the same `ostream` from</span></div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno">   70</span><span class="comment"> * another thread.  This can cause very-hard-to-identify crashes, such as double-frees reported</span></div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno">   71</span><span class="comment"> * from deep inside `ostream`-related library code.  Garbled output may be okay in a pinch, but crashes and other</span></div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno">   72</span><span class="comment"> * concurrency-corruption issues are never okay!</span></div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno">   73</span><span class="comment"> *</span></div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno">   74</span><span class="comment"> * One&#39;s reaction to that might be &quot;of course!&quot; -- it&#39;s simply messing with an `ostream` from 2+ different threads</span></div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno">   75</span><span class="comment"> * simultaneously: it should be expected to break.  However, an essentially identical problem -- which one</span></div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno">   76</span><span class="comment"> * might assume wouldn&#39;t exist (but one would be wrong) -- is the following.  Suppose everything is as described</span></div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno">   77</span><span class="comment"> * in the previous paragraph, except that the &quot;outside code accessing stream from another thread simultaneously&quot;</span></div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno">   78</span><span class="comment"> * isn&#39;t unrelated but rather simply *another* Simple_ostream_logger S2 that happened to be</span></div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno">   79</span><span class="comment"> * constructed against `ostream` S, same as S1 was.  This, too, can break dangerously in the same ways and for</span></div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno">   80</span><span class="comment"> * the same reason.  That is, Simple_ostream_logger takes no special measures to prevent this; all built-in</span></div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno">   81</span><span class="comment"> * thread-safety measures apply to multi-threaded uses of each given `*this` -- not across different `*this`es.</span></div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno">   82</span><span class="comment"> */</span></div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"><a class="line" href="classflow_1_1log_1_1Simple__ostream__logger.html">   83</a></span><span class="keyword">class </span><a class="code hl_class" href="classflow_1_1log_1_1Simple__ostream__logger.html">Simple_ostream_logger</a> :</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno">   84</span>  <span class="keyword">public</span> <a class="code hl_class" href="classflow_1_1log_1_1Logger.html">Logger</a></div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno">   85</span>{</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno">   86</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno">   87</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno">   88</span><span class="comment"></span> </div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno">   89</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno">   90</span><span class="comment">   * Constructs logger to subsequently log to the given standard `ostream` (or 2 thereof).</span></div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno">   91</span><span class="comment">   *</span></div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno">   92</span><span class="comment">   * @warning It is strongly recommended that numeric format state (for integers) in `os` and `os_for_err` be at</span></div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno">   93</span><span class="comment">   *          default values (e.g, no `std::hex` or non-default fill character) at entry to this constructor.</span></div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno">   94</span><span class="comment">   *          Otherwise the contents of prefixes within log output will be formatted in some undefined way.</span></div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno">   95</span><span class="comment">   *</span></div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno">   96</span><span class="comment">   * Note that usually one SHOULD avoid writing anything</span></div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno">   97</span><span class="comment">   * to `os` or `os_for_err` once they&#39;ve been passed to Simple_ostream_logger.  Logs should not (usually) be mixed with</span></div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno">   98</span><span class="comment">   * other output, as (1) it would look odd; and (2) interleaving may occur, since there is no mutex making logging</span></div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno">   99</span><span class="comment">   * mutually exclusive against other output to the same stream(s).  Update: It might be worse that that; see</span></div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno">  100</span><span class="comment">   * thread safety notes in Simple_ostream_logger doc header.  Reiterating: Really one and only one</span></div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno">  101</span><span class="comment">   * Simple_ostream_logger should access a given `ostream`, and no other code should.</span></div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno">  102</span><span class="comment">   *</span></div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno">  103</span><span class="comment">   * The case `&amp;os == &amp;os_for_err` (in other words they are the same stream) is not only allowed but likely common,</span></div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno">  104</span><span class="comment">   * so that post-factum redirect of `stderr` into `stdout` (often done via `2&gt;&amp;1` on command line) becomes unnecessary.</span></div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno">  105</span><span class="comment">   *</span></div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno">  106</span><span class="comment">   * @param config</span></div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno">  107</span><span class="comment">   *        Controls behavior of this Logger.  In particular, it affects should_log() logic (verbosity default and</span></div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno">  108</span><span class="comment">   *        per-component) and output format (such as time stamp format).  See thread safety notes in class doc header.</span></div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno">  109</span><span class="comment">   *        This is saved in #m_config.</span></div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno">  110</span><span class="comment">   * @param os</span></div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno">  111</span><span class="comment">   *        `ostream` to which to log messages of severity strictly less severe than Sev::S_WARNING.</span></div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno">  112</span><span class="comment">   * @param os_for_err</span></div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno">  113</span><span class="comment">   *        `ostream` to which to log messages of severity Sev::S_WARNING or more severe.</span></div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno">  114</span><span class="comment">   */</span></div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno">  115</span>  <span class="keyword">explicit</span> <a class="code hl_function" href="classflow_1_1log_1_1Simple__ostream__logger.html#a5ee701f0f163047f9620ab91d653da18">Simple_ostream_logger</a>(<a class="code hl_class" href="classflow_1_1log_1_1Config.html">Config</a>* config,</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno">  116</span>                                 std::ostream&amp; os = std::cout, std::ostream&amp; os_for_err = std::cerr);</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno">  117</span> </div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno">  118</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno">  119</span><span class="comment"></span> </div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno">  120</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno">  121</span><span class="comment">   * Implements interface method by returning `true` if the severity and component (which is allowed to be null)</span></div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno">  122</span><span class="comment">   * indicate it should.  As of this writing not thread-safe against changes to `*m_config`.</span></div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno">  123</span><span class="comment">   *</span></div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno">  124</span><span class="comment">   * @param sev</span></div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno">  125</span><span class="comment">   *        Severity of the message.</span></div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno">  126</span><span class="comment">   * @param component</span></div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno">  127</span><span class="comment">   *        Component of the message.  Reminder: `component.empty() == true` is allowed.</span></div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno">  128</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno">  129</span><span class="comment">   */</span></div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno">  130</span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1log_1_1Simple__ostream__logger.html#aaf1987dc4e163db1c13e6f4407135fa9">should_log</a>(<a class="code hl_enumeration" href="namespaceflow_1_1log.html#a5c602384e6fe9d7642740ac2fae4ad04">Sev</a> sev, <span class="keyword">const</span> <a class="code hl_class" href="classflow_1_1log_1_1Component.html">Component</a>&amp; component) <span class="keyword">const override</span>;</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno">  131</span><span class="comment"></span> </div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno">  132</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno">  133</span><span class="comment">   * Implements interface method by returning `false`, indicating that this Logger will not need the contents of</span></div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno">  134</span><span class="comment">   * `*metadata` and `msg` passed to do_log(), as the latter will output them synchronously.</span></div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno">  135</span><span class="comment">   *</span></div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno">  136</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno">  137</span><span class="comment">   */</span></div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno">  138</span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classflow_1_1log_1_1Simple__ostream__logger.html#a1548d51e8314a9cff0669f20cae9ae76">logs_asynchronously</a>() <span class="keyword">const override</span>;</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno">  139</span><span class="comment"></span> </div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno">  140</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno">  141</span><span class="comment">   * Implements interface method by synchronously logging the message and some subset of the metadata in a fashion</span></div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno">  142</span><span class="comment">   * controlled by #m_config.</span></div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno">  143</span><span class="comment">   *</span></div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno">  144</span><span class="comment">   * @param metadata</span></div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno">  145</span><span class="comment">   *        All information to potentially log in addition to `msg`.</span></div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno">  146</span><span class="comment">   * @param msg</span></div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno">  147</span><span class="comment">   *        The message.</span></div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno">  148</span><span class="comment">   */</span></div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno">  149</span>  <span class="keywordtype">void</span> <a class="code hl_function" href="classflow_1_1log_1_1Simple__ostream__logger.html#a44192b92a16bc07f8d99beb6ad25c826">do_log</a>(<a class="code hl_struct" href="structflow_1_1log_1_1Msg__metadata.html">Msg_metadata</a>* metadata, <a class="code hl_typedef" href="namespaceflow_1_1util.html#ae4dc52186797094b3040379ff19124c9">util::String_view</a> msg) <span class="keyword">override</span>;</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno">  150</span> </div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno">  151</span>  <span class="comment">// Data.  (Public!)</span></div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno">  152</span><span class="comment"></span> </div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno">  153</span><span class="comment">  /// Reference to the config object passed to constructor.  Note that object is mutable; see notes on thread safety.</span></div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"><a class="line" href="classflow_1_1log_1_1Simple__ostream__logger.html#a57abde2223144cdec0f1f4edc35fdc88">  154</a></span><span class="comment"></span>  <a class="code hl_class" href="classflow_1_1log_1_1Config.html">Config</a>* <span class="keyword">const</span> <a class="code hl_variable" href="classflow_1_1log_1_1Simple__ostream__logger.html#a57abde2223144cdec0f1f4edc35fdc88">m_config</a>;</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno">  155</span> </div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno">  156</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno">  157</span> </div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno">  158</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno">  159</span><span class="comment"></span> </div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno">  160</span><span class="comment">  /// Short-hand for ref-counted pointer to a given Ostream_log_msg_writer.  See #m_os_writers for ref-count rationale.</span></div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"><a class="line" href="classflow_1_1log_1_1Simple__ostream__logger.html#aab34dd83954eeea35278207912589d0f">  161</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classflow_1_1log_1_1Simple__ostream__logger.html#aab34dd83954eeea35278207912589d0f">Ostream_log_msg_writer_ptr</a> = boost::shared_ptr&lt;Ostream_log_msg_writer&gt;;</div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno">  162</span> </div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno">  163</span>  <span class="comment">// Data.</span></div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno">  164</span><span class="comment"></span> </div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno">  165</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno">  166</span><span class="comment">   * Stream writers via which to log messages, each element corresponding to a certain set of possible severities</span></div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno">  167</span><span class="comment">   * (as of this writing, warnings or worse versus all others).</span></div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno">  168</span><span class="comment">   * 2+ pointers stored may point to the same object (see constructor body), if they share the same `ostream`.</span></div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno">  169</span><span class="comment">   * In that case, ref-counted pointer mechanics will ensure the shared Ostream_log_msg_writer is freed when</span></div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno">  170</span><span class="comment">   * #m_os_writers `array` is freed, when `*this` is destroyed.</span></div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno">  171</span><span class="comment">   */</span></div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"><a class="line" href="classflow_1_1log_1_1Simple__ostream__logger.html#a1ef85d2192fb0cd3977944a20bfa61f9">  172</a></span>  boost::array&lt;Ostream_log_msg_writer_ptr, 2&gt; <a class="code hl_variable" href="classflow_1_1log_1_1Simple__ostream__logger.html#a1ef85d2192fb0cd3977944a20bfa61f9">m_os_writers</a>;</div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno">  173</span><span class="comment"></span> </div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno">  174</span><span class="comment">  /// Mutex protecting against log messages being logged concurrently and thus being garbled.</span></div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"><a class="line" href="classflow_1_1log_1_1Simple__ostream__logger.html#afb59fd5bf48efeb52d11af8a2d4d2379">  175</a></span><span class="comment"></span>  <span class="keyword">mutable</span> <a class="code hl_typedef" href="namespaceflow_1_1util.html#add6ade273326f27eaf9bfd170a909626">util::Mutex_non_recursive</a> <a class="code hl_variable" href="classflow_1_1log_1_1Simple__ostream__logger.html#afb59fd5bf48efeb52d11af8a2d4d2379">m_log_mutex</a>;</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno">  176</span>}; <span class="comment">// class Simple_ostream_logger</span></div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno">  177</span> </div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno">  178</span>} <span class="comment">// namespace flow::log</span></div>
<div class="ttc" id="aclassflow_1_1log_1_1Component_html"><div class="ttname"><a href="classflow_1_1log_1_1Component.html">flow::log::Component</a></div><div class="ttdoc">A light-weight class, each object storing a component payload encoding an enum value from enum type o...</div><div class="ttdef"><b>Definition:</b> <a href="log_8hpp_source.html#l00839">log.hpp:840</a></div></div>
<div class="ttc" id="aclassflow_1_1log_1_1Config_html"><div class="ttname"><a href="classflow_1_1log_1_1Config.html">flow::log::Config</a></div><div class="ttdoc">Class used to configure the filtering and logging behavior of Loggers; its use in your custom Loggers...</div><div class="ttdef"><b>Definition:</b> <a href="config_8hpp_source.html#l00316">config.hpp:317</a></div></div>
<div class="ttc" id="aclassflow_1_1log_1_1Logger_html"><div class="ttname"><a href="classflow_1_1log_1_1Logger.html">flow::log::Logger</a></div><div class="ttdoc">Interface that the user should implement, passing the implementing Logger into logging classes (Flow'...</div><div class="ttdef"><b>Definition:</b> <a href="log_8hpp_source.html#l01280">log.hpp:1284</a></div></div>
<div class="ttc" id="aclassflow_1_1log_1_1Simple__ostream__logger_html"><div class="ttname"><a href="classflow_1_1log_1_1Simple__ostream__logger.html">flow::log::Simple_ostream_logger</a></div><div class="ttdoc">An implementation of Logger that logs messages to the given ostreams (e.g., cout or an ofstream for a...</div><div class="ttdef"><b>Definition:</b> <a href="simple__ostream__logger_8hpp_source.html#l00083">simple_ostream_logger.hpp:85</a></div></div>
<div class="ttc" id="aclassflow_1_1log_1_1Simple__ostream__logger_html_a1548d51e8314a9cff0669f20cae9ae76"><div class="ttname"><a href="classflow_1_1log_1_1Simple__ostream__logger.html#a1548d51e8314a9cff0669f20cae9ae76">flow::log::Simple_ostream_logger::logs_asynchronously</a></div><div class="ttdeci">bool logs_asynchronously() const override</div><div class="ttdoc">Implements interface method by returning false, indicating that this Logger will not need the content...</div><div class="ttdef"><b>Definition:</b> <a href="simple__ostream__logger_8cpp_source.html#l00048">simple_ostream_logger.cpp:48</a></div></div>
<div class="ttc" id="aclassflow_1_1log_1_1Simple__ostream__logger_html_a1ef85d2192fb0cd3977944a20bfa61f9"><div class="ttname"><a href="classflow_1_1log_1_1Simple__ostream__logger.html#a1ef85d2192fb0cd3977944a20bfa61f9">flow::log::Simple_ostream_logger::m_os_writers</a></div><div class="ttdeci">boost::array&lt; Ostream_log_msg_writer_ptr, 2 &gt; m_os_writers</div><div class="ttdoc">Stream writers via which to log messages, each element corresponding to a certain set of possible sev...</div><div class="ttdef"><b>Definition:</b> <a href="simple__ostream__logger_8hpp_source.html#l00172">simple_ostream_logger.hpp:172</a></div></div>
<div class="ttc" id="aclassflow_1_1log_1_1Simple__ostream__logger_html_a44192b92a16bc07f8d99beb6ad25c826"><div class="ttname"><a href="classflow_1_1log_1_1Simple__ostream__logger.html#a44192b92a16bc07f8d99beb6ad25c826">flow::log::Simple_ostream_logger::do_log</a></div><div class="ttdeci">void do_log(Msg_metadata *metadata, util::String_view msg) override</div><div class="ttdoc">Implements interface method by synchronously logging the message and some subset of the metadata in a...</div><div class="ttdef"><b>Definition:</b> <a href="simple__ostream__logger_8cpp_source.html#l00053">simple_ostream_logger.cpp:53</a></div></div>
<div class="ttc" id="aclassflow_1_1log_1_1Simple__ostream__logger_html_a57abde2223144cdec0f1f4edc35fdc88"><div class="ttname"><a href="classflow_1_1log_1_1Simple__ostream__logger.html#a57abde2223144cdec0f1f4edc35fdc88">flow::log::Simple_ostream_logger::m_config</a></div><div class="ttdeci">Config *const m_config</div><div class="ttdoc">Reference to the config object passed to constructor. Note that object is mutable; see notes on threa...</div><div class="ttdef"><b>Definition:</b> <a href="simple__ostream__logger_8hpp_source.html#l00154">simple_ostream_logger.hpp:154</a></div></div>
<div class="ttc" id="aclassflow_1_1log_1_1Simple__ostream__logger_html_a5ee701f0f163047f9620ab91d653da18"><div class="ttname"><a href="classflow_1_1log_1_1Simple__ostream__logger.html#a5ee701f0f163047f9620ab91d653da18">flow::log::Simple_ostream_logger::Simple_ostream_logger</a></div><div class="ttdeci">Simple_ostream_logger(Config *config, std::ostream &amp;os=std::cout, std::ostream &amp;os_for_err=std::cerr)</div><div class="ttdoc">Constructs logger to subsequently log to the given standard ostream (or 2 thereof).</div><div class="ttdef"><b>Definition:</b> <a href="simple__ostream__logger_8cpp_source.html#l00027">simple_ostream_logger.cpp:27</a></div></div>
<div class="ttc" id="aclassflow_1_1log_1_1Simple__ostream__logger_html_aab34dd83954eeea35278207912589d0f"><div class="ttname"><a href="classflow_1_1log_1_1Simple__ostream__logger.html#aab34dd83954eeea35278207912589d0f">flow::log::Simple_ostream_logger::Ostream_log_msg_writer_ptr</a></div><div class="ttdeci">boost::shared_ptr&lt; Ostream_log_msg_writer &gt; Ostream_log_msg_writer_ptr</div><div class="ttdoc">Short-hand for ref-counted pointer to a given Ostream_log_msg_writer. See m_os_writers for ref-count ...</div><div class="ttdef"><b>Definition:</b> <a href="simple__ostream__logger_8hpp_source.html#l00161">simple_ostream_logger.hpp:161</a></div></div>
<div class="ttc" id="aclassflow_1_1log_1_1Simple__ostream__logger_html_aaf1987dc4e163db1c13e6f4407135fa9"><div class="ttname"><a href="classflow_1_1log_1_1Simple__ostream__logger.html#aaf1987dc4e163db1c13e6f4407135fa9">flow::log::Simple_ostream_logger::should_log</a></div><div class="ttdeci">bool should_log(Sev sev, const Component &amp;component) const override</div><div class="ttdoc">Implements interface method by returning true if the severity and component (which is allowed to be n...</div><div class="ttdef"><b>Definition:</b> <a href="simple__ostream__logger_8cpp_source.html#l00043">simple_ostream_logger.cpp:43</a></div></div>
<div class="ttc" id="aclassflow_1_1log_1_1Simple__ostream__logger_html_afb59fd5bf48efeb52d11af8a2d4d2379"><div class="ttname"><a href="classflow_1_1log_1_1Simple__ostream__logger.html#afb59fd5bf48efeb52d11af8a2d4d2379">flow::log::Simple_ostream_logger::m_log_mutex</a></div><div class="ttdeci">util::Mutex_non_recursive m_log_mutex</div><div class="ttdoc">Mutex protecting against log messages being logged concurrently and thus being garbled.</div><div class="ttdef"><b>Definition:</b> <a href="simple__ostream__logger_8hpp_source.html#l00175">simple_ostream_logger.hpp:175</a></div></div>
<div class="ttc" id="alog_8hpp_html"><div class="ttname"><a href="log_8hpp.html">log.hpp</a></div></div>
<div class="ttc" id="anamespaceflow_1_1log_html"><div class="ttname"><a href="namespaceflow_1_1log.html">flow::log</a></div><div class="ttdoc">Flow module providing logging functionality.</div><div class="ttdef"><b>Definition:</b> <a href="async__file__logger_8cpp_source.html#l00027">async_file_logger.cpp:28</a></div></div>
<div class="ttc" id="anamespaceflow_1_1log_html_a5c602384e6fe9d7642740ac2fae4ad04"><div class="ttname"><a href="namespaceflow_1_1log.html#a5c602384e6fe9d7642740ac2fae4ad04">flow::log::Sev</a></div><div class="ttdeci">Sev</div><div class="ttdoc">Enumeration containing one of several message severity levels, ordered from highest to lowest.</div><div class="ttdef"><b>Definition:</b> <a href="log__fwd_8hpp_source.html#l00223">log_fwd.hpp:224</a></div></div>
<div class="ttc" id="anamespaceflow_1_1util_html_add6ade273326f27eaf9bfd170a909626"><div class="ttname"><a href="namespaceflow_1_1util.html#add6ade273326f27eaf9bfd170a909626">flow::util::Mutex_non_recursive</a></div><div class="ttdeci">boost::mutex Mutex_non_recursive</div><div class="ttdoc">Short-hand for non-reentrant, exclusive mutex. (&quot;Reentrant&quot; = one can lock an already-locked-in-that-...</div><div class="ttdef"><b>Definition:</b> <a href="util__fwd_8hpp_source.html#l00215">util_fwd.hpp:215</a></div></div>
<div class="ttc" id="anamespaceflow_1_1util_html_ae4dc52186797094b3040379ff19124c9"><div class="ttname"><a href="namespaceflow_1_1util.html#ae4dc52186797094b3040379ff19124c9">flow::util::String_view</a></div><div class="ttdeci">Basic_string_view&lt; char &gt; String_view</div><div class="ttdoc">Commonly used char-based Basic_string_view. See its doc header.</div><div class="ttdef"><b>Definition:</b> <a href="string__view_8hpp_source.html#l00191">string_view.hpp:191</a></div></div>
<div class="ttc" id="aostream__log__msg__writer_8hpp_html"><div class="ttname"><a href="ostream__log__msg__writer_8hpp.html">ostream_log_msg_writer.hpp</a></div></div>
<div class="ttc" id="astructflow_1_1log_1_1Msg__metadata_html"><div class="ttname"><a href="structflow_1_1log_1_1Msg__metadata.html">flow::log::Msg_metadata</a></div><div class="ttdoc">Simple data store containing all of the information generated at every logging call site by flow::log...</div><div class="ttdef"><b>Definition:</b> <a href="log_8hpp_source.html#l01040">log.hpp:1041</a></div></div>
<div class="ttc" id="autil__fwd_8hpp_html"><div class="ttname"><a href="util__fwd_8hpp.html">util_fwd.hpp</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Mar 28 2025 22:55:35 for Flow by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4
</small></address>
</body>
</html>
